#include "independent_keys.h"


// 用u8的8位二进制的每一位来存储按键状态
u8 indp_key_state = 0x0f;


//按键的GPIO配置
void independent_keys_init(){
	// 配置灯端口
	GPIO_InitTypeDef init;
	
	// 配置
	init.Pin = GPIO_Pin_6 | GPIO_Pin_7;
	// 端口模式
	init.Mode = GPIO_PullUp;
	// 端口初始化
	GPIO_Inilize(GPIO_P4, &init);
}


u8 KEY_(int n){
	switch (n) {
	case 1:
		return KEY_L;
		break;
	case 2:
		return KEY_R;
		break;
	}
}


// 判断last_key_state_u8某位是保存的按键状态
u8 last_key_state(int i){
	if((indp_key_state & (1<<i)) > 0){
		return UP;
	}else{
		return DOWN;
	}
}


// 独立按键
void independent_keys(void (*key_down_func)(u8 n), void (*key_up_func)(u8 n)){
	// 位存贮
	/*
	  用宏设置为便捷方式 (一点不便捷)
	  设置具体位置为0 与等: last_key_st &= ~(1<<i)
	  设置具体位置为1 或等: last_key_st |= 1<<i
	  设置具体位置取反    : last_key_st ^= 1<<i
	 */
	int i;
	for(i = 0; i < KEYS_SUM; i++){
		// 取某位的值: last_key_st & (1<<i) 
		if(KEY_(i+1) == DOWN && last_key_state(i) == UP){	
			// 设置对应位为按下状态
			indp_key_state &= ~(1 << i);
			if(key_down_func != NULL){
				key_down_func(i + 1);
			}
		}
		if(KEY_(i+1) == UP && last_key_state(i) == DOWN){
			// 设置对应位为弹起
			indp_key_state |= 1 << i;
			if(key_up_func != NULL){
				key_up_func(i + 1);
			}
		}
	}
}

